#include "jcff_stc_gpio.h"
/*
 ===============================================================================
                       ##### IO operation functions #####
 ===============================================================================
*/

/**
  * @brief  Config the GPIO mode.
  * @param  GPIOx where x can be (0..7) to select the GPIO peripheral for STC8 device or
  * @param  GPIO_Init specifies the port bit mode.
  * @retval The execution result, RV_FAIL--fail to config, RV_SUCCESS--success to config.
  */
RV GPIO_Init(GPIO_PortType GPIOx, GPIO_InitTypeDef *GPIO_Init)
{
    RV RetVal = RV_FAIL;
    if((GPIOx == GPIO0) || (GPIOx == GPIO1) || (GPIOx == GPIO2) || (GPIOx == GPIO3) \
        || (GPIOx == GPIO4) || (GPIOx == GPIO5) || (GPIOx == GPIO6) || (GPIOx == GPIO7))
    {
        /*Init GPIO0*/
        if(GPIOx == GPIO0)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P0M1 &= ~GPIO_Init -> Pin ;
                P0M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P0M1 |= ~GPIO_Init -> Pin ;
                P0M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P0M1 |= GPIO_Init -> Pin ;
                P0M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P0M1 |= GPIO_Init -> Pin ;
                P0M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P0PU = GPIO_Init -> Pin ;
            }
            else
            {
                P0PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P0NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P0NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO1*/
        else if(GPIOx == GPIO1)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P1M1 &= ~GPIO_Init -> Pin ;
                P1M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P1M1 |= ~GPIO_Init -> Pin ;
                P1M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P1M1 |= GPIO_Init -> Pin ;
                P1M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P1M1 |= GPIO_Init -> Pin ;
                P1M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P1PU = GPIO_Init -> Pin ;
            }
            else
            {
                P1PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P1NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P1NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO2*/
        else if(GPIOx == GPIO2)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P2M1 &= ~GPIO_Init -> Pin ;
                P2M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P2M1 |= ~GPIO_Init -> Pin ;
                P2M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P2M1 |= GPIO_Init -> Pin ;
                P2M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P2M1 |= GPIO_Init -> Pin ;
                P2M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P2PU = GPIO_Init -> Pin ;
            }
            else
            {
                P2PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P2NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P2NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO3*/
        else if(GPIOx == GPIO3)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P3M1 &= ~GPIO_Init -> Pin ;
                P3M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P3M1 |= ~GPIO_Init -> Pin ;
                P3M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P3M1 |= GPIO_Init -> Pin ;
                P3M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P3M1 |= GPIO_Init -> Pin ;
                P3M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P3PU = GPIO_Init -> Pin ;
            }
            else
            {
                P3PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P3NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P3NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO4*/
        else if(GPIOx == GPIO4)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P4M1 &= ~GPIO_Init -> Pin ;
                P4M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P4M1 |= ~GPIO_Init -> Pin ;
                P4M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P4M1 |= GPIO_Init -> Pin ;
                P4M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P4M1 |= GPIO_Init -> Pin ;
                P4M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P4PU = GPIO_Init -> Pin ;
            }
            else
            {
                P4PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P4NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P4NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO5*/
        else if(GPIOx == GPIO5)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P5M1 &= ~GPIO_Init -> Pin ;
                P5M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P5M1 |= ~GPIO_Init -> Pin ;
                P5M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P5M1 |= GPIO_Init -> Pin ;
                P5M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P5M1 |= GPIO_Init -> Pin ;
                P5M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P5PU = GPIO_Init -> Pin ;
            }
            else
            {
                P5PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P5NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P5NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO6*/ 
        else if(GPIOx == GPIO6)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P6M1 &= ~GPIO_Init -> Pin ;
                P6M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P6M1 |= ~GPIO_Init -> Pin ;
                P6M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P6M1 |= GPIO_Init -> Pin ;
                P6M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P6M1 |= GPIO_Init -> Pin ;
                P6M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P6PU = GPIO_Init -> Pin ;
            }
            else
            {
                P6PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P6NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P6NCS = GPIO_Init -> Pin ;
            }
            RetVal = RV_SUCCESS;
        }

        /*Init GPIO7*/
        else if(GPIOx == GPIO7)
        {
            /*Set the gpio mode*/
            if(GPIO_Init -> Mode == GPIO_MODE_STD_BIDIR)
            {
                P7M1 &= ~GPIO_Init -> Pin ;
                P7M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_PP)
            {
                P7M1 |= ~GPIO_Init -> Pin ;
                P7M0 &= GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_INPUT_HIGHRES)
            {
                P7M1 |= GPIO_Init -> Pin ;
                P7M0 &= ~GPIO_Init -> Pin ;
            }
            else if(GPIO_Init -> Mode == GPIO_MODE_OUTPUT_OD)
            {
                P7M1 |= GPIO_Init -> Pin ;
                P7M0 |= GPIO_Init -> Pin ;
            }
            /*Set if pull up the io*/
            if(GPIO_Init -> Pullup == true)
            {
                P7PU = GPIO_Init -> Pin ;
            }
            else
            {
                P7PU = ~GPIO_Init -> Pin ;
            }

            /*Set if enable the dchmidt trigger*/
            if(GPIO_Init -> EnableSmt == true)
            {
                P7NCS = ~GPIO_Init -> Pin ;
            }
            else
            {
                P7NCS = GPIO_Init -> Pin ;
            }
            
        }
        else
        {
            RetVal = RV_FAIL;
        }
    }
    return RetVal;   
}

/**
  * @brief  Write data to gpio.
  * @param  GPIOx where x can be (0..7) to select the GPIO peripheral for STC8 device or
  * @param  Val Data you want to write, the val is from (0b00000000 ~ 0b11111111)
  * @retval The execution result, RV_FAIL--fail to config, RV_SUCCESS--success to config.
  */
RV GPIO_WriteData(GPIO_PortType GPIOx, uint8_t Val)
{
    RV RetVal = RV_FAIL;
    if(GPIOx == GPIO0)
    {
        P0 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO1)
    {
        P1 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO2)
    {
        P2 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO3)
    {
        P3 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO4)
    {
        P4 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO5)
    {
        P5 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO6)
    {
        P6 = Val;
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO7)
    {
        P7 = Val;
        RetVal = RV_SUCCESS;
    }
    return RetVal;
}

/**
  * @brief  Read data from GPIO
  * @param  GPIOx where x can be (0..7) to select the GPIO peripheral for STC8 device or
  * @retval The Port value.
  */
uint8_t GPIO_ReadData(GPIO_PortType GPIOx, Val)
{
    uint8_t RetVal;
    if(GPIOx == GPIO0)
    {
        RetVal = P0;
    }
    else if(GPIOx == GPIO1)
    {
        RetVal = P1;
    }
    else if(GPIOx == GPIO2)
    {
        RetVal = P2;
    }
    else if(GPIOx == GPIO3)
    {
        RetVal = P3;
    }
    else if(GPIOx == GPIO4)
    {
        RetVal = P4;
    }
    else if(GPIOx == GPIO5)
    {
        RetVal = P5;
    }
    else if(GPIOx == GPIO6)
    {
        RetVal = P6;
    }
    else if(GPIOx == GPIO7)
    {
        RetVal = P7;
    }
	return RetVal;
}

/**
  * @brief  Write data to gpio pin.
  * @param  GPIOx where x can be (0..7) to select the GPIO peripheral for STC8 device or
  * @param  Pin where x can be (0..7) to select the GPIO pin for STC8 device or
  * @param  PinState Set pin value, 0 or 1
  * @retval The execution result, RV_FAIL--fail to config, RV_SUCCESS--success to config.
  */
RV GPIO_WritePin(GPIO_PortType GPIOx, uint8_t Pin, GPIO_PinState PinState)
{
    RV RetVal = RV_FAIL;
    if(GPIOx == GPIO0)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P0 &= ~Pin;
        }
        else
        {
            P0 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO1)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P1 &= ~Pin;
        }
        else
        {
            P1 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO2)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P2 &= ~Pin;
        }
        else
        {
            P2 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO3)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P3 &= ~Pin;
        }
        else
        {
            P3 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO4)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P4 &= ~Pin;
        }
        else
        {
            P4 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO5)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P5 &= ~Pin;
        }
        else
        {
            P5 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO6)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P6 &= ~Pin;
        }
        else
        {
            P6 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    else if(GPIOx == GPIO7)
    {
        if(PinState == GPIO_PIN_RESET)
        {
            P7 &= ~Pin;
        }
        else
        {
            P7 |= Pin;
        }
        RetVal = RV_SUCCESS;
    }
    return RetVal;
}

/**
  * @brief  Read pin states.
  * @param  GPIOx where x can be (0..7) to select the GPIO peripheral for STC8 device or
  * @param  Pin where x can be (0..7) to select the GPIO pin for STC8 device or
  * @retval Pin states 0 or 1.
  */
GPIO_PinState GPIO_ReadPin(GPIO_PortType GPIOx, uint8_t Pin)
{
    GPIO_PinState RetVal;
    if(GPIOx == GPIO0)
    {
        if((P0 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO1)
    {
        if((P1 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO2)
    {
        if((P2 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO3)
    {
        if((P3 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO4)
    {
        if((P4 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO5)
    {
        if((P5 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO6)
    {
        if((P6 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
    else if(GPIOx == GPIO7)
    {
        if((P7 & Pin) == 0)
        {
            RetVal = GPIO_PIN_RESET;
        }
        else
        {
            RetVal = GPIO_PIN_SET;
        }
    }
	return RetVal;
}